package org.uiot.protocol

import org.uiot.protocol.group.Groupable

/**
 * 基于字节码的通讯封包特征
 * Bytecode-based packet
 */
trait PacketTraits {

    static enum Direction {
        Upstream(0), Downstream(1)
        final int value

        private Direction(int value) { this.value = value }

        static Direction byValue(int val) {
            values().find { it.value == val } ?:
                    { throw new IllegalArgumentException("Packet\$Direction ${val} not found") }()
        }
    }

    static enum Part {
        Header(0), Body(10), Checking(15)
        final int value

        private Part(int value) { this.value = value }

        static Part byValue(int val) {
            values().find { it.value == val } ?:
                    { throw new IllegalArgumentException("Packet\$Part ${val} not found") }()
        }
    }

    static class BodyGroupType implements Serializable {
        Groupable.Type request
        Groupable.Type response
    }

    Integer code
//    String hexCode
    String label
    /**
     * （发起）方向
     * 由终端发起，平台响应，即上行；由平台发起，终端响应，即下行。
     */
    Direction direction

    /**
     * 正文编组类型
     * 当使用请求响应一体化的数据包定义时，支持请求和响应采用不同的正文编组结构。
     */
    BodyGroupType bodyGroupType
}